/*
 * @Author: 葛文杰
 * @Date: 2021/2/20 12:00
 * @Description: egg service 枚举数据
 */

'use strict';
const Service = require('egg').Service;
const EnumerationManageProxy = require('../proxy/enumerationManageProxy');
const { buildTableData, getEnumerationTypeName } = require('../util/utils');


class EnumerationManage extends Service {

    /**
     * 获取枚举列表
     * @param enumerationName
     * @param enumerationType
     * @param pageNo
     * @param pageSize
     * @return {Promise<{total: *, pageNo: *, pageSize: *, tableData: *}|{total: *, pageNo: *, pageSize: *, tableData: *}>}
     */
    async getEnumerationList(enumerationName, enumerationType, pageNo, pageSize) {
        const conn = await this.app.mysql.beginTransaction();
        try {
            const enumerationList = await EnumerationManageProxy.getEnumerationList(conn, enumerationName, enumerationType, pageNo, pageSize);
            const total = await EnumerationManageProxy.getEnumerationTotal(conn, enumerationName, enumerationType);
            await conn.commit(); // 提交事务
            return buildTableData(enumerationList, total, pageNo, pageSize);
        } catch (err) {
            await conn.rollback(); // 一定记得捕获异常后回滚事务！！
            throw err;
        }
    }

    /**
     * 根据类型获取枚举数据数组
     * @param codeArray [] 枚举类型
     * @return {Promise<{total: *, pageNo: *, pageSize: *, tableData: *}>}
     */
    async getEnumerationListByCodes(codeArray) {
        const conn = await this.app.mysql.beginTransaction();
        try {
            let enumerationObject = {};
            let enumerationArray;
            for (let code of codeArray) {
                enumerationArray = await EnumerationManageProxy.getEnumerationListByCode(conn, code);
                enumerationObject[code] = enumerationArray;
            }
            await conn.commit(); // 提交事务
            return enumerationObject;
        } catch (err) {
            await conn.rollback(); // 一定记得捕获异常后回滚事务！！
            throw err;
        }
    }

    /**
     * 保存枚举数据
     * @param enumerationId 枚举Id
     * @param enumerationName 枚举名称
     * @param enumerationType 枚举类型
     * @param enumerationValue 枚举值
     * @return {Promise<void>}
     */
    // TODO 返回值需要商定
    async saveEnumerationInfo(enumerationId, enumerationType, enumerationName, enumerationValue) {
        const conn = await this.app.mysql.beginTransaction();
        try {
            let enumerationInfo = {
                enumerationType,
                enumerationName,
                enumerationValue
            };
            const isExistSameEnumerationInfo =
              await EnumerationManageProxy.judgeIsExistSameEnumeration(conn, enumerationId, enumerationInfo);
            let result;
            if (isExistSameEnumerationInfo) {
                result = {
                    isExistSameEnumeration: true
                };
            } else {
                let enumerationTypeName = getEnumerationTypeName(enumerationType);
                enumerationInfo.enumerationTypeName = enumerationTypeName;
                result = await EnumerationManageProxy.saveEnumerationInfo(conn, enumerationInfo);
            }
            await conn.commit();
            return result;
        } catch (err) {
            await conn.rollback(); // 一定记得捕获异常后回滚事务！！
            throw err;
        }
    }

    /**
     * 修改枚举数据
     * @param enumerationId 枚举Id
     * @param enumerationName 枚举名称
     * @param enumerationType 枚举类型
     * @param enumerationValue 枚举值
     * @return {Promise<void>}
     */
    async updateEnumerationInfoById(enumerationId, enumerationType, enumerationName, enumerationValue) {
        const conn = await this.app.mysql.beginTransaction();
        try {
            let enumerationInfo = {
                enumerationType,
                enumerationName,
                enumerationValue
            };
            const isExistSameEnumerationInfo =
              await EnumerationManageProxy.judgeIsExistSameEnumeration(conn, enumerationId, enumerationInfo);
            let result;
            if (isExistSameEnumerationInfo) {
                result = {
                    isExistSameEnumeration: true
                };
            } else {
                let enumerationTypeName = getEnumerationTypeName(enumerationType);
                enumerationInfo.id = enumerationId;
                enumerationInfo.enumerationTypeName = enumerationTypeName;
                result = await EnumerationManageProxy.updateEnumerationInfoById(conn, enumerationId, enumerationInfo);
            }
            await conn.commit();
            return result;
        } catch (err) {
            await conn.rollback(); // 一定记得捕获异常后回滚事务！！
            throw err;
        }
    }

    /**
     * 通过id删除
     * @return {Promise<void>}
     */
    async deleteEnumerationById(enumerationId) {
        const conn = await this.app.mysql.beginTransaction(); // 初始化事务
        try {
            let condition = {
                id: enumerationId,
            };
            const result = await EnumerationManageProxy.deleteEnumerationById(conn, condition);
            await conn.commit();
            return result;
        } catch (err) {
            await conn.rollback();
            throw err;
        }
    }
}

module.exports = EnumerationManage;
